<?php
require_once 'BancoDeDados.php';
require_once 'Objeto.php';
class Origem {

    private $cod_origem;
    private $pais;
    private $estado;
    private $cidade;
    private $vinculado;
    private $objeto;

    public function &getCod_origem() {
        return $this->cod_origem;
    }

    public function setCod_origem(&$cod_origem) {
        $this->cod_origem = &$cod_origem;
    }

    public function &getPais() {
        return $this->pais;
    }

    public function setPais(&$pais) {
        $this->pais = &$pais;
    }

    public function &getEstado() {
        return $this->estado;
    }

    public function setEstado(&$estado) {
        $this->estado = &$estado;
    }

    public function &getCidade() {
        return $this->cidade;
    }

    public function setCidade(&$cidade) {
        $this->cidade = &$cidade;
    }

    public function isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    /**
     *
     * @return Objeto
     */
    public function &getObjeto() {
        return $this->objeto;
    }

    public function setObjeto(Objeto &$objeto) {
        $this->objeto = &$objeto;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Origem existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into origem (pais, estado, cidade) values(?,?,?)');
        $result = $link->execute($stmt, array($this->pais, $this->estado, $this->cidade));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'pais' && $this->pais != $campo_valor) {
            $this->pais = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Origem existente");
            }
        } else if ($campo_id == 'estado' && $this->estado != $campo_valor) {
            $this->estado = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Origem existente");
            }
        } else if ($campo_id == 'cidade' && $this->cidade != $campo_valor) {
            $this->cidade = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Origem existente");
            }
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update origem set ' . $campo_id . ' = ? where cod_origem = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_origem));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from origem where cod_origem = ?');
        $result = $link->execute($stmt, array($this->cod_origem));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from origem');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $origem = new Origem();
            $origem->setCod_origem($row['cod_origem']);
            $origem->setPais($row['pais']);
            $origem->setEstado($row['estado']);
            $origem->setCidade($row['cidade']);
            $origem->setVinculado($origem->verificarVinculacao());
            $resultado[] = &$origem;
            unset ($origem);
        }
        return $resultado;
    }
    
    public static function consultar(Objeto &$objeto, &$cod_origem) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from origem where cod_origem = ?', array($cod_origem));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if($result->numRows() == 0) {
            throw new Exception("Origem inexistente");
        } elseif($result->numRows() > 1) {
            throw new Exception("Mais de uma Origem com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $origem = new Origem();
        $origem->setCod_origem($row['cod_origem']);
        $origem->setPais($row['pais']);
        $origem->setEstado($row['estado']);
        $origem->setCidade($row['cidade']);
        $origem->setObjeto($objeto);
        return $origem;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_origem from origem where pais = ? and estado = ? and cidade = ?', array($this->pais, $this->estado, $this->cidade));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }
    
    private function verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('SELECT cod_origem from objeto where cod_origem = ?', array($this->cod_origem));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            return 1;
        }
        return 0;
    }

    public function cadastrarObjeto() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_origem from objeto where cod_origem = ? and cod_interno = ?', array($this->cod_origem, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() > 0) {
            throw new Exception('Origem existente');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_origem = ? where cod_interno = ?');
        $result = $link->execute($stmt, array($this->cod_origem, $this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluirObjeto() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update objeto set cod_origem = null where cod_interno = ?');
        $result = $link->execute($stmt, array($this->objeto->getCod_interno()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

}
?>